package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.VentaDAO;
import pe.com.casadesign.domain.ListaVenta;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.Facturacion;
import pe.com.casadesign.domain.ListaFacturacion;
import pe.com.casadesign.domain.Venta;
import pe.com.casadesign.service.VentaService;
import pe.com.casadesign.service.util.Constantes;

/**
 * Implementacion de VentaService.
 * 
 * @author Pedro Vera
 * 
 */
@Service
public class VentaServiceImpl implements VentaService {
	private static final Logger logger = LoggerFactory.getLogger(VentaServiceImpl.class);
	
	@Autowired
    private VentaDAO ventaDAO;
	
	@Override
	public ListaVenta listarVenta(Venta venta) {
		return ventaDAO.listarVenta(venta);
	}

	@Override
	public Venta obtenerVenta(Venta venta) {
		return ventaDAO.obtenerVenta(venta);
	}

	@Override
	public Venta buscarVenta(Venta venta) {
		return ventaDAO.buscarVenta(venta);
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado registrarVenta(Venta venta) {
		boolean resultado = ventaDAO.registrarVenta(venta);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(venta.getCodVenta()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarVenta(Venta venta) {
		boolean resultado = ventaDAO.modificarVenta(venta)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(venta.getCodVenta()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado actualizarVenta(Venta ventaActual, Venta VentaNueva){
		boolean resultado1 = ventaDAO.registrarVenta(ventaActual);
		boolean resultado2 = ventaDAO.actualizarVenta(VentaNueva)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(VentaNueva.getCodVenta()));
		operacionResultado.setEsOK((resultado1&&resultado2)?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	// ------------------------------
	
	@Override
	public ListaFacturacion listarFactura(Venta venta) {
		return ventaDAO.listarFactura(venta);
	}
	
	@Override
	public Facturacion obtenerFactura(Facturacion factura) {
		return ventaDAO.obtenerFactura(factura);
	}
	
	@Override
	public Venta buscarFactura(Venta venta) {
		return ventaDAO.buscarFactura(venta);
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado registrarFactura(Venta venta, Facturacion factura) {
		boolean resultadoVenta = ventaDAO.modificarVenta(venta)>0;
		boolean resultado = ventaDAO.registrarFactura(venta, factura);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(factura.getCodFactura()));
		operacionResultado.setEsOK(resultado&&resultadoVenta?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarFactura(Venta venta, Facturacion factura) {
		boolean resultadoVenta = ventaDAO.modificarVenta(venta)>0;
		boolean resultado = ventaDAO.modificarFactura(factura)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(factura.getCodFactura()));
		operacionResultado.setEsOK(resultado&&resultadoVenta?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
}
